package com.kaifamiao.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class InvokeInstanceMethod {

    public static void main(String[] args) throws Exception {

        final Class<?> c = Sheep.class;

        Constructor<?> con = c.getDeclaredConstructor(String.class );
        if( !Modifier.isPublic(con.getModifiers()) ) {
            con.setAccessible(true);
        }
        final Object instance = con.newInstance("喜羊羊");

        final Method gm = c.getDeclaredMethod( "getName");

        final int mod = gm.getModifiers();

        if( Modifier.isStatic( mod ) ) {
            return;
        }

        if( !Modifier.isPublic( mod ) ) {
            gm.setAccessible( true );
        }

        // 调用 instance 的 gm 方法(实例方法) 并为其传入参数 最后获得其返回值
        Object result = gm.invoke( instance ); // Object res = instance.getName()
        System.out.println( result );

        final Method sm = c.getDeclaredMethod( "setName" , String.class );
        sm.setAccessible( true );
        // 调用 instance 的 sm 方法(实例方法) 并为其传入参数 最后获得其返回值
        result = sm.invoke( instance , "美羊羊" ); // instance.setName( "美羊羊" )
        System.out.println( result );

        System.out.println( gm.invoke( instance ) ); // instance.getName()

    }

}
